انتقل إلى المحتوى الرئيسي

القاعات

صورة صفحة القاعات

محتويات الفولدر Halls​

// Halls Folder Content
HallsRequest.tsx;
useHalls.ts;
HallsView.tsx;

HallsRequest.tsx​

import { TFunction } from "i18next";
import * as z from "zod";

export const schema = (t: TFunction) =>
z.object({
name: z
.string({ required_error: t("pages.halls.inputs.name.errors.required") })
.min(1, t("pages.halls.inputs.name.errors.min")),
});
export type HallsRequestType = z.infer<ReturnType<typeof schema>>;
  • هنا راح تلكة السكيما الخاصة بالقاعات والي هنا بس الاسم وبيه Validation خاصة بالانبوت مالتة

useHalls.ts​

// Get Request
export const useHallsQuery = () => {
return useQuery<Hall[]>({
queryKey: ["halls"],
queryFn: () => getHalls(),
});
};
const {
data: halls,
isLoading,
isError: hallsFetchError,
isSuccess: hallsFetchSuccess,
} = useHallsQuery();
  • هاي راح تجيب القاعات كلها مالتي وياها States تخص نجاح او فشل جلب البيانات
// add new hall
const createHall = useMutation({
mutationFn: addHall,
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ["halls"],
refetchType: "active",
});
setOpenDialog(false);
reset(defaultValues);
toast.success(
t("successMessage", {
description: t("pages.halls.successMessages.added"),
})
);
},
onError: (error: any) => {
if (axios.isAxiosError(error)) {
const errorMessage = error.response?.data?.message || "Unknown error";
console.log("errorMessage", errorMessage);
toast.error(errorMessage);
} else {
console.error("Unexpected error", error);
}
},
});
  • دالة علمود تضيف قاعة جديدة وراح تسوي Refetch من جديد ويتخزن بالكاش النتيجة الجديدة وبنفس الوقت يكنسل Dialog الاضافة ويعرض رسالة
  • اذا ما نجحت العملية هم يرجع رسالة
const updateHall = useMutation({
mutationFn: editHall,
onSuccess: () => {
queryClient.invalidateQueries({
queryKey: ["halls"],
refetchType: "active",
});
setSelectedHall(null);
setOpenDialog(false);
reset(defaultValues);
toast.success(
t("successMessage", {
description: t("pages.halls.successMessages.update"),
})
);
},
onError: (error: any) => {
toast.error(t("errorMessage"), {
description: error?.response?.data?.errors[0].message,
});
console.error("error while editing hall", error);
},
});
// حدث او ضيف بناء على هل المستخدم اختار قاعة ام لا
const onSubmit = (data: HallsRequestType) => {
if (selectedHall) {
updateHall.mutate({ id: selectedHall, name: data.name });
} else {
createHall.mutate(data);
}
};
  • هنا عندي دالتين همة :

    • onSubmit : هاي الدالة راح تجيك اذا اليوزر اختار قاعة اذا روح حدثلي القاعة , واذا ما اختار قاعة يعني كاعد يدخل وحدة جديدة وبهاي الحالة سوي POST
    • updateHall : هاي الدالة مشابهة للي قبلها بس الفرق هنا اني عندي تحديث للقاعة , بس همينة راح يسوي نفس الاكشن مال القبلها اذا نجح او فشل

ملاحظة : عملية الحذف ايضا نفس الشي بس الفرق راح ادز القاعة المختارة المعرف مالتها وبس هاهية الباقي نفس الشي نفس الفوكانيات


HallsView.tsx​

هاي هنا راح اجيب الدوال الي موجودة بال Custom Hook وراح يتم استخدامها بالView (ال UI) وهذا جزء منة

<div className="grid grid-cols-1 md:grid-cols-2 xl:grid-cols-3 gap-4 mt-4">
{halls?.map((hall) => (
<div
className="flex flex-col cursor-pointer gap-6 border rounded-lg p-8 shadow-md outline outline-secondary hover:outline-primary transition-all duration-300 "
key={hall.id}
>
<div className="flex justify-between items-center">
<h2 className="text-2xl">{hall.name}</h2>
<div className="flex gap-2">
<Button
variant={"secondary"}
onClick={() => openEditHallDialog(hall.id)}
>
<Pencil className="h-4 w-4" />
</Button>
<Button onClick={() => openDeleteHallDialog(hall.id)}>
<Trash className="h-4 w-4" />
</Button>
</div>
</div>
<p>
{t("pages.halls.tableCount")}: {hall.tables.length}
</p>
</div>
))}
</div>

طبعا دايما صفحة ال View هي خاصة بس بعرض المحتوى واغلب اللوجك معزول لهذا راح تلكة الشرح بيها اقل شي .